package xio.ccf_201809;

import java.util.*;


/**
 * 元素选择器 100分
 */
public class ElementSelector {
    // 文档元素列表
    private static List<Node> dom = new ArrayList<>();
    // 一个选择器选中的结果行数的集合
    private static Set<Integer> resultSet = new LinkedHashSet<>();

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        // 输入文档有 n 行
        int n = sc.nextInt();
        // m 个待查询的选择器
        int m = sc.nextInt();
        sc.nextLine();

        // 解析输入文档，每一行作为一个 Node，并加入 dom 列表
        for (int i = 0; i < n; i++) {
            Node node = new Node();
            String tmp = sc.nextLine();
            // 获取缩进了多少个点，作为等级
            int lastIndexDot = tmp.lastIndexOf('.') + 1;
            node.level = lastIndexDot;

            // 缩进点之后的为元素内容
            tmp = tmp.substring(lastIndexDot);

            for (String item : tmp.split(" ")) {
                if (item.charAt(0) == '#') {
                    // # 开始的为 id, id 区分大小写
                    node.id = item;
                } else {
                    // 标签大小写不敏感，那统一用小写
                    node.div = item.toLowerCase();
                }
            }
            dom.add(node);
        }


        // 每一次读取一个选择器，并立即打印出查询到的结果
        for (int i = 0; i < m; i++) {
            String selector = sc.nextLine();
            resultSet.clear();

            // 开始进行选择器匹配
            search(0, -1, 0, selector.split(" "));

            // 输出当前选出器查询到的结果
            System.out.print(resultSet.size());
            for (Integer item : resultSet) {
                System.out.print(" " + item);
            }
            System.out.println();
        }
    }

    /**
     * 选择器查询匹配
     * @param idx 文档dom开始查询的位置
     * @param fatherLevel 上一缩进等级；这次来进行匹配的dom 元素等级应大于此值（即更加缩进）。
     * @param idc 当前查询的选择器级数
     * @param selectors 选择器数组
     */
    private static void search(int idx, int fatherLevel, int idc, String[] selectors) {

        // 以及匹配到选择器最后一级了，说明匹配到了一个，将行数加入resultSet
        if (idc == selectors.length) {
            resultSet.add(idx);
            return;
        }
        // 找不到了，返回
        if (idx == dom.size()) {
            return;
        }
        for (int i = idx; i < dom.size(); i++) {
            Node node = dom.get(i);
            if (node.level <= fatherLevel) {
                return;
            }

            // 当前要匹配的那一级选择器
            String sel = selectors[idc];
            // 匹配当前元素的名称或者id，匹配成功就继续找选择器的下一层
            if ((node.div != null && node.div.equals(sel.toLowerCase()))
                    || (node.id != null && node.id.equals(sel))) {

                search(i + 1, node.level, idc + 1, selectors);
            }
        }

    }

    /**
     * 文档元素
     * 一个元素只能有一个 id
     */
    static class Node {
        int level; // 缩进等级，用点的个数来表示
        String div; // 元素名
        String id;
    }
}

